home *** CD-ROM | disk | FTP | other *** search
/ Skunkware 5 / Skunkware 5.iso / src / X11 / seyon / SeWin.c < prev    next >
C/C++ Source or Header  |  1995-05-03  |  24KB  |  1,087 lines

  1.  
  2. /*
  3.  * This file is part of the Seyon, Copyright (c) 1992-1993 by Muhammad M.
  4.  * Saggaf. All rights reserved.
  5.  *
  6.  * See the file COPYING (1-COPYING) or the manual page seyon(1) for a full
  7.  * statement of rights and permissions for this program.
  8.  */
  9.  
  10. #include <setjmp.h>
  11.  
  12. #include <X11/Intrinsic.h>
  13. #include <X11/StringDefs.h>
  14. #include <X11/Shell.h>
  15. #include <X11/Xmu/CharSet.h>
  16. #include <X11/Xaw/Command.h>
  17. #include <X11/Xaw/List.h>
  18. #include "MultiList.h"
  19. #include <X11/Xaw/Toggle.h>
  20. #include <X11/Xaw/AsciiText.h>
  21. #include <X11/Xaw/Box.h>
  22. #include <X11/Xaw/Dialog.h>
  23. #include <X11/Xaw/Form.h>
  24. #include <X11/Xaw/Paned.h>
  25.  
  26. #include "seyon.h"
  27. #include "SeDecl.h"
  28.  
  29. extern Widget   topLevel;
  30. extern Widget   statusMessage;
  31. extern Pixmap   progIcon;
  32.  
  33. void            SePopupMsg(),
  34.                 EditSaveFile(),
  35.                 StopMainLoop();
  36.  
  37. Boolean         DoMainLoop;
  38.  
  39. /*
  40.  * does nothing
  41.  */
  42.  
  43. void
  44. DoNothing()
  45. {
  46.   return;
  47. }
  48.  
  49. /*
  50.  * distroys a popup
  51.  */
  52.  
  53. void
  54. DestroyShell(widget)
  55.      Widget          widget;
  56. {
  57.   Widget          shell = GetShell(widget);
  58.  
  59.   XtPopdown(shell);
  60.   XtDestroyWidget(shell);
  61. }
  62.  
  63. void
  64. DestroyShellCallBack(widget, child)
  65.      Widget          widget;
  66.      XtPointer       child;
  67. {
  68.   DestroyShell((Widget)child);
  69. }
  70.  
  71. void
  72. DestroyParentPopup(widget, child)
  73.      Widget          widget;
  74.      XtPointer       child;
  75. {
  76.   DestroyShellCallBack(widget, child);
  77. }
  78.  
  79. void
  80. DismissPopup(widget, upFlag)
  81.      Widget          widget;
  82.      XtPointer       upFlag;
  83. {
  84.   *((Boolean*)upFlag) = False;
  85.   DestroyShell(widget);
  86. }
  87.  
  88. void
  89. ResetFlag(widget, flag)
  90.      Widget          widget;
  91.      XtPointer       flag;
  92. {
  93.   *((Boolean*)flag) = False;
  94. }
  95.  
  96. void
  97. SetSensitiveOn(widget, callData)
  98.      Widget          widget;
  99.      XtPointer       callData;
  100. {
  101.   XtVaSetValues((Widget)callData, XtNsensitive, True, NULL);
  102. }
  103.  
  104. /*
  105.  * creates a button
  106.  */
  107.  
  108. Widget
  109. SeAddButton(name, parent, call_back)
  110.      String          name;
  111.      Widget          parent;
  112.      void            (*call_back) ();
  113. {
  114.   Widget          widget;
  115.  
  116.   widget = XtCreateManagedWidget(name, commandWidgetClass, parent, NULL, 0);
  117.   XtAddCallback(widget, XtNcallback, call_back, (XtPointer) parent);
  118.   return widget;
  119. }
  120.  
  121. /*
  122.  * similar to the above, but also passes client data to the call back
  123.  * WCD = with client data
  124.  */
  125.  
  126. Widget
  127. SeAddButtonWCD(name, parent, callBack, clientData)
  128.      String          name;
  129.      Widget          parent;
  130.      void            (*callBack) ();
  131.      XtPointer       clientData;
  132. {
  133.   return AddButton(name, parent, callBack, clientData);
  134. }
  135.  
  136. Widget
  137. AddButton(name, parent, callBack, clientData)
  138.      String          name;
  139.      Widget          parent;
  140.      void            (*callBack) ();
  141.      XtPointer       clientData;
  142. {
  143.   Widget          widget;
  144.  
  145.   widget = XtCreateManagedWidget(name, commandWidgetClass, parent, NULL, 0);
  146.   if (callBack)
  147.     XtAddCallback(widget, XtNcallback, callBack, clientData);
  148.   return widget;
  149. }
  150.  
  151. Widget
  152. SeAddButtonWithClientData(name, parent, call_back, client_data)
  153.      String          name;
  154.      Widget          parent;
  155.      void            (*call_back) ();
  156.      XtPointer       client_data;
  157. {
  158.   return SeAddButtonWCD(name, parent, call_back, client_data);
  159. }
  160.  
  161. /*
  162.  * creates a label
  163.  */
  164.  
  165. Widget
  166. SeAddLabel(name, parent)
  167.      String          name;
  168.      Widget          parent;
  169. {
  170.   return XtCreateManagedWidget(name, labelWidgetClass, parent, NULL, 0);
  171. }
  172.  
  173. /*
  174.  * sets a widget's label
  175.  */
  176.  
  177. void
  178. SeSetLabel(widget, label)
  179.      Widget          widget;
  180.      String          label;
  181. {
  182.   XtVaSetValues(widget, XtNlabel, label, NULL);
  183. }
  184.  
  185. /*
  186.  * creates a toggle
  187.  */
  188.  
  189. Widget
  190. SeAddToggleWCD(name, parent, call_back, clientData)
  191.      String          name;
  192.      Widget          parent;
  193.      void            (*call_back) ();
  194.      XtPointer       clientData;
  195. {
  196.   Widget          widget;
  197.  
  198.   widget = XtCreateManagedWidget(name, toggleWidgetClass, parent, NULL, 0);
  199.   if (call_back) {
  200.     if (clientData == NULL)
  201.       clientData = (XtPointer) parent;
  202.     XtAddCallback(widget, XtNcallback, call_back, clientData);
  203.   }
  204.   return widget;
  205. }
  206.  
  207. Widget
  208. SeAddToggle(name, parent, call_back)
  209.      String          name;
  210.      Widget          parent;
  211.      void            (*call_back) ();
  212. {
  213.   return SeAddToggleWCD(name, parent, call_back, NULL);
  214. }
  215.  
  216. /*
  217.  * sets or unsets a toggle
  218.  */
  219.  
  220. void
  221. SeSetUnsetToggle(widget, state)
  222.      Widget          widget;
  223.      Boolean         state;
  224. {
  225.   XtVaSetValues(widget, XtNstate, state, NULL);
  226. }
  227.  
  228. /*
  229.  * gets a toggle's state
  230.  */
  231.  
  232. Boolean
  233. SeGetToggleState(widget)
  234.      Widget          widget;
  235. {
  236.   Boolean         state;
  237.  
  238.   XtVaGetValues(widget, XtNstate, &state, NULL);
  239.   return state;
  240. }
  241.  
  242. Widget
  243. SePopupRadio(popup_name, parent, name, active, call_back, clientData)
  244.      String          popup_name;
  245.      Widget          parent;
  246.      String          name[];
  247.      int             active;
  248.      void            (*call_back) ();
  249.      XtPointer       clientData;
  250. {
  251.   Widget          popup,
  252.                   mBox,
  253.                   uBox,
  254.                   lBox,
  255.                   toggle,
  256.                   widget;
  257.   long            i = 0;
  258.  
  259.   popup = AddSimplePopup(popup_name, parent);
  260.   mBox = SeAddPaned("mBox", popup);
  261.   uBox = SeAddBox("Radio", mBox);
  262.   lBox = SeAddBox("lBox", mBox);
  263.  
  264.   toggle =
  265.     XtVaCreateManagedWidget(name[i], toggleWidgetClass, uBox, XtNradioData,
  266.                 (XtPointer) (i + 1), NULL);
  267.   SeSetUnsetToggle(toggle, (active == i + 1));
  268.   XtAddCallback(toggle, XtNcallback, call_back, clientData);
  269.  
  270.   for (i++; name[i]; i++) {
  271.     widget =
  272.       XtVaCreateManagedWidget(name[i], toggleWidgetClass, uBox, XtNradioGroup,
  273.                toggle, XtNradioData, (XtPointer) (i + 1), NULL);
  274.     SeSetUnsetToggle(widget, (active == i + 1));
  275.     XtAddCallback(widget, XtNcallback, call_back, clientData);
  276.   }
  277.  
  278.   SeAddButtonWCD("dismiss", lBox, DestroyParentPopup, (XtPointer) mBox);
  279.  
  280.   PopupCentered(popup, parent);
  281.   return toggle;
  282. }
  283.  
  284. /*
  285.  * AddBox: creates a box.
  286.  */
  287.  
  288. Widget
  289. AddBox(name, parent)
  290.      String          name;
  291.      Widget          parent;
  292. {
  293.   return XtCreateManagedWidget(name, boxWidgetClass, parent, NULL, 0);
  294. }
  295.  
  296. Widget
  297. SeAddBox(name, parent)
  298.      String          name;
  299.      Widget          parent;
  300. {
  301.   return AddBox(name, parent);
  302. }
  303.  
  304. /*
  305.  * AddDialog: creates a dialog widget.
  306.  */
  307.  
  308. Widget
  309. AddDialog(name, parent)
  310.      String          name;
  311.      Widget          parent;
  312. {
  313.   return XtCreateManagedWidget(name, dialogWidgetClass, parent, NULL, 0);
  314. }
  315.  
  316. Widget
  317. SeAddDialog(name, parent)
  318.      String          name;
  319.      Widget          parent;
  320. {
  321.   return AddDialog(name, parent);
  322. }
  323.  
  324. /*
  325.  * sets a dialog's label
  326.  */
  327.  
  328. void
  329. SeSetDialogValue(dialog, value)
  330.      Widget          dialog;
  331.      String          value;
  332. {
  333.   Arg             args;
  334.  
  335.   XtSetArg(args, XtNvalue, value);
  336.   XtSetValues(dialog, &args, 1);
  337. }
  338.  
  339. Widget
  340. PopupDialogGetValue(name, parent, callBack, clientData, defVal)
  341.      String          name;
  342.      Widget          parent;
  343.      void            (*callBack)();
  344.      XtPointer       clientData;
  345.      String          defVal;
  346. {
  347.   Widget          popup,
  348.                   dialog;
  349.  
  350.   popup = AddSimplePopup(name, parent);
  351.   dialog = AddDialog("dialog", popup);
  352.  
  353.   XtVaSetValues(dialog, XtNvalue, (defVal ? defVal : ""), NULL);
  354.   if (clientData == NULL) clientData = (XtPointer)dialog;
  355.  
  356.   XawDialogAddButton(dialog, "ok", callBack, clientData);
  357.   XawDialogAddButton(dialog, "cancel", DestroyShell, (XtPointer)dialog);
  358.  
  359.   return dialog;
  360. }
  361.  
  362. char   getValueDefValue[REG_BUF];
  363. void   (*getValueExecProc)();
  364.  
  365. void
  366. GetValueDispatchProc(valueWidget)
  367.      Widget          valueWidget;
  368. {
  369.   Widget          dialog = XtParent(valueWidget);
  370.  
  371.   strcpy(getValueDefValue, XawDialogGetValueString(dialog));
  372.   DestroyShell(dialog);
  373.  
  374.   (*getValueExecProc)(XtParent(GetShell(valueWidget)), getValueDefValue);
  375. }
  376.  
  377. void
  378. GetValueByPopupOKAction(widget)
  379.   Widget          widget;
  380. {
  381.   GetValueDispatchProc(widget);
  382. }
  383.  
  384. void
  385. GetValueByPopup(widget, name, callback)
  386.      Widget          widget;
  387.      String          name;
  388.      XtCallbackProc  callback;
  389. {
  390.   Widget          popup,
  391.                   dialog;
  392.   
  393.   getValueExecProc = (void (*)())callback;
  394.   popup = GetShell((dialog = PopupDialogGetValue(name, widget,
  395.                                GetValueDispatchProc, NULL, 
  396.                                getValueDefValue)));
  397.  
  398.   PopupCentered(popup, widget);
  399. }
  400.  
  401. Widget
  402. SePopupDialogGetStringE(popup_name, parent, ok_callback,
  403.             ok_client_data, def_val, UL)
  404.      String          popup_name;
  405.      Widget          parent;
  406.      void            (*ok_callback) ();
  407.      XtPointer       ok_client_data;
  408.      String          def_val;
  409.      Boolean         UL;
  410. {
  411.   Widget          dialog;
  412.  
  413.   dialog = PopupDialogGetValue(popup_name, parent, ok_callback,
  414.                                 ok_client_data, def_val);
  415.   PopupCentered(GetShell(dialog), parent);
  416.   return dialog;
  417. }
  418.  
  419. Widget
  420. SePopupDialogGetString(popup_name, parent, ok_callback,
  421.                ok_client_data)
  422.      String          popup_name;
  423.      Widget          parent;
  424.      void            (*ok_callback) ();
  425.      XtPointer       ok_client_data;
  426. {
  427.   return SePopupDialogGetStringE(popup_name, parent, ok_callback,
  428.                  ok_client_data, NULL, False);
  429. }
  430.  
  431. /*
  432.  * creates a from
  433.  */
  434.  
  435. Widget
  436. SeAddForm(name, parent)
  437.      String          name;
  438.      Widget          parent;
  439. {
  440.   return XtCreateManagedWidget(name, formWidgetClass, parent, NULL, 0);
  441. }
  442.  
  443. Widget
  444. AddPaned(name, parent)
  445.      String          name;
  446.      Widget          parent;
  447. {
  448.   return XtCreateManagedWidget(name, panedWidgetClass, parent, NULL, 0);
  449. }
  450.  
  451. Widget
  452. SeAddPaned(name, parent)
  453.      String          name;
  454.      Widget          parent;
  455. {
  456.   return AddPaned(name, parent);
  457. }
  458.  
  459. /*
  460.  * sets a viewport's dimensions
  461.  */
  462.  
  463. void
  464. SeSetViewportDimensions(viewport, child, max_height)
  465.      Widget          viewport,
  466.                      child;
  467.      Dimension       max_height;
  468. {
  469.   SeSetWidgetWidth(viewport, SeWidgetWidth(child) + 14);
  470.  
  471.   if (SeWidgetHeight(child) > max_height)
  472.     SeSetWidgetHeight(viewport, max_height);
  473. }
  474.  
  475. /*
  476.  * sets a viwport's dimensions according to a child list
  477.  */
  478.  
  479. void
  480. SeSetViewportDimFromList(viewport, list, rows)
  481.      Widget          viewport,
  482.                      list;
  483.      Cardinal        rows;
  484. {
  485.   XFontStruct    *font;
  486.   Dimension       height,
  487.                   internalHeight,
  488.                   rowSpacing,
  489.                   borderWidth;
  490.  
  491.   XtVaGetValues(list, XtNfont, &font, XtNinternalHeight, &internalHeight,
  492.                 XtNrowSpacing, &rowSpacing, XtNborderWidth, &borderWidth, 
  493.                 NULL);
  494.  
  495.   height = font->ascent + font->descent;
  496.   height = height * rows + rowSpacing * (rows - 1) +
  497.     2 * (internalHeight + borderWidth);
  498.  
  499.   SeSetViewportDimensions(viewport, list, height);
  500. }
  501.  
  502. /*
  503.  * sets a viwport's dimensions according to a child multi-list
  504.  */
  505.  
  506. void
  507. SeSetViewportDimFromMultiList(viewport, list, rows)
  508.      Widget          viewport,
  509.                      list;
  510.      Cardinal        rows;
  511. {
  512.   Dimension       rowHeight,
  513.                   borderWidth;
  514.  
  515.   XtVaGetValues(list, XtNrowHeight, &rowHeight, XtNborderWidth, &borderWidth,
  516.                 NULL);
  517.  
  518.   SeSetViewportDimensions(viewport, list,
  519.               rowHeight * rows + 2 * borderWidth);
  520. }
  521.  
  522. Widget
  523. GetShell(widget)
  524.      Widget          widget;
  525. {
  526.   while ((widget != NULL) && !XtIsShell(widget))
  527.     widget = XtParent(widget);
  528.  
  529.   return (widget);
  530. }
  531.  
  532. int
  533. IconifyShell(widget)
  534.      Widget          widget;
  535. {
  536.   widget = GetShell(widget);
  537.   return (int)XIconifyWindow(XtDisplay(widget), XtWindow(widget), 
  538.                              XScreenNumberOfScreen(XtScreen(widget)));
  539. }
  540.  
  541. /*
  542.  *   Creates a popup with a bit more control on geometry.
  543.  *   WG = With Geometry
  544.  */
  545.  
  546. void
  547. CenterShell(widget, geomParent)
  548.      Widget          widget,
  549.                      geomParent;
  550. {
  551.   Dimension width, height, borderWidth;
  552.   Position x, y, maxPos;
  553.  
  554.   XtVaGetValues(geomParent, XtNwidth, &width, XtNheight, &height, NULL);
  555.   XtTranslateCoords(geomParent, (Position)width/2, (Position)height/2, 
  556.                     &x, &y);
  557.  
  558.   widget = GetShell(widget);
  559.   if (!XtIsRealized(widget)) XtRealizeWidget(widget);
  560.  
  561.   XtVaGetValues(widget, XtNwidth, &width, XtNheight, &height, XtNborderWidth,
  562.                 &borderWidth, NULL);
  563.  
  564.   width += 2 * borderWidth;
  565.   height += 2 * borderWidth;
  566.  
  567.   x -= (Position)width/2;
  568.   if (x < 0) x = 0;
  569.   if (x > (maxPos = (Position)(XtScreen(widget)->width - width))) 
  570.     x = maxPos;
  571.  
  572.   y -= (Position)height/2;
  573.   if (y < 0) y = 0;
  574.   if (y > (maxPos = (Position)(XtScreen(widget)->height - height))) 
  575.     y = maxPos;
  576.  
  577.   XtVaSetValues(widget, XtNx, x, XtNy, y, NULL);
  578. }
  579.  
  580. void
  581. CenterShellOnRoot(widget)
  582.      Widget          widget;
  583. {
  584.   Dimension width, height, borderWidth;
  585.   Position x, y;
  586.  
  587.   widget = GetShell(widget);
  588.   if (!XtIsRealized(widget)) XtRealizeWidget(widget);
  589.  
  590.   XtVaGetValues(widget, XtNwidth, &width, XtNheight, &height, XtNborderWidth,
  591.                 &borderWidth, NULL);
  592.  
  593.   width += 2 * borderWidth;
  594.   height += 2 * borderWidth;
  595.  
  596.   x = (Position)(XtScreen(widget)->width - width)/2;
  597.   y = (Position)(XtScreen(widget)->height - height)/2;
  598.  
  599.   XtVaSetValues(widget, XtNx, x, XtNy, y, NULL);
  600. }
  601.  
  602. void
  603. PositionShell(widget, parent, posStyle)
  604.      Widget          widget;
  605.      Widget          parent;
  606.      int             posStyle;
  607. {
  608.   Dimension width, height /*, borderWidth*/;
  609.   Position x, y;
  610.  
  611.   widget = GetShell(widget);
  612.   if (!XtIsRealized(widget)) XtRealizeWidget(widget);
  613.  
  614.   switch (posStyle) {
  615.   case  SHELLPOS_HWFH:
  616.     XtVaGetValues(parent, XtNwidth, &width, XtNheight, &height, NULL);
  617.     XtTranslateCoords(parent, (Position)width/2, (Position)height, &x, &y);
  618.     XtVaSetValues(widget, XtNx, x, XtNy, y, NULL);
  619.     break;
  620.   }
  621. }
  622.  
  623. Widget
  624. SeAddPopupWG(name, parent, x_widget, y_widget, x_offset, y_offset, topLev,
  625.          setGeom)
  626.      String          name;
  627.      Widget          parent,
  628.                      x_widget,
  629.                      y_widget;
  630.      Position        x_offset,
  631.                      y_offset;
  632.      Boolean         topLev;
  633.      Boolean         setGeom;
  634. {
  635.   Widget          popup;
  636.   Position        x,
  637.                   y,
  638.                   dummy;
  639.  
  640.   if (x_widget == NULL)
  641.     x_widget = parent;
  642.   if (y_widget == NULL)
  643.     y_widget = x_widget;
  644.  
  645.   if (topLev)
  646.     popup = XtVaCreatePopupShell(name, topLevelShellWidgetClass, parent,
  647.                                  XtNiconPixmap, progIcon, NULL);
  648.   else
  649.     popup = XtVaCreatePopupShell(name, transientShellWidgetClass, parent,
  650.                                  XtNtransientFor, GetShell(parent),
  651.                                  XtNiconPixmap, progIcon, NULL);
  652.  
  653.   if (setGeom) {
  654.     XtTranslateCoords(x_widget, x_offset, (Position)0, &x, &dummy);
  655.     XtTranslateCoords(y_widget, (Position)0, y_offset, &dummy, &y);
  656.     XtVaSetValues(popup, XtNx, x, XtNy, y, NULL);
  657.   }
  658.  
  659.   return popup;
  660. }
  661.  
  662. Widget
  663. AddSimplePopup(name, parent)
  664.      String          name;
  665.      Widget          parent;
  666. {
  667.   return XtVaCreatePopupShell(name, transientShellWidgetClass, parent,
  668.                               XtNtransientFor, GetShell(parent),
  669.                               XtNiconPixmap, progIcon, NULL);
  670. }
  671.  
  672. Widget
  673. SeAddPopup(name, parent)
  674.      String          name;
  675.      Widget          parent;
  676. {
  677.   return SeAddPopupWG(name, parent, NULL, NULL, SeWidgetWidth(parent) / 2,
  678.               SeWidgetHeight(parent), False, True);
  679. }
  680.  
  681. Widget
  682. SeAddPopupOffset(name, parent, geomParent)
  683.      String          name;
  684.      Widget          parent;
  685.      Widget          geomParent;
  686. {
  687.   return SeAddPopupWG(name, parent, geomParent, geomParent, 10, 10, False,
  688.               True);
  689. }
  690.  
  691. Widget
  692. SeAddPopupUL(name, parent)
  693.      String          name;
  694.      Widget          parent;
  695. {
  696.   return SeAddPopupOffset(name, parent, XtParent(parent));
  697. }
  698.  
  699. Widget
  700. SeAddPopupSh(name, parent)
  701.      String          name;
  702.      Widget          parent;
  703. {
  704.   return SeAddPopupOffset(name, parent, GetShell(parent));
  705. }
  706.  
  707. /*
  708.  * pops up a message
  709.  */
  710.  
  711. void
  712. SePopupMsg(parent, msg)
  713.      Widget          parent;
  714.      String          msg;
  715. {
  716.   Widget          popup,
  717.                   dialog;
  718.   Arg             args;
  719.  
  720.   popup = SeAddPopup("message", parent);
  721.  
  722.   XtSetArg(args, XtNlabel, msg);
  723.   dialog = XtCreateManagedWidget("dialog", dialogWidgetClass, popup,
  724.                  &args, 1);
  725.  
  726.   XawDialogAddButton(dialog, "dismiss", DestroyShell, (XtPointer)dialog);
  727.  
  728.   XtPopup(popup, XtGrabExclusive);
  729. }
  730.  
  731. void
  732. SePopupMsgf(parent, fmt, a, b, c)
  733.      Widget          parent;
  734.      String          fmt,
  735.                      a,
  736.                      b,
  737.                      c;
  738. {
  739.   char            buf[REG_BUF];
  740.  
  741.   sprintf(buf, fmt, a, b, c);
  742.   SePopupMsg(parent, buf);
  743. }
  744.  
  745. Widget
  746. SePopupNotice(parent, title, call_back, msg)
  747.      Widget          parent;
  748.      String          title;
  749.      void            (*call_back) ();
  750.      String          msg;
  751. {
  752.   Widget          popup,
  753.                   dialog;
  754.  
  755.   popup = SeAddPopupUL("notice", parent);
  756.   XtVaSetValues(popup, XtNtitle, title, NULL);
  757.   dialog = XtVaCreateManagedWidget("dialog", dialogWidgetClass, popup,
  758.                    XtNlabel, msg, NULL);
  759.  
  760.   XawDialogAddButton(dialog, "dismiss", call_back, (XtPointer) dialog);
  761.  
  762.   XtPopup(popup, XtGrabExclusive);
  763.   return popup;
  764. }
  765.  
  766. void
  767. SePopupNoticeF(parent, title, call_back, fmt, a, b, c, d)
  768.      Widget          parent;
  769.      String          title;
  770.      void            (*call_back) ();
  771.      String          fmt,
  772.                      a,
  773.                      b,
  774.                      c,
  775.                      d;
  776. {
  777.   char            buf[REG_BUF];
  778.  
  779.   sprintf(buf, fmt, a, b, c);
  780.   SePopupNotice(parent, title, call_back, buf);
  781. }
  782.  
  783. /*
  784.  * almost similar to the above
  785.  */
  786.  
  787. void
  788. SeTransMsg(name, parent)
  789.      String          name;
  790.      Widget          parent;
  791. {
  792.   Widget          popup,
  793.                   dialog;
  794.  
  795.   popup = SeAddPopup(name, parent);
  796.   dialog = XtCreateManagedWidget("dialog", dialogWidgetClass, popup,
  797.                  NULL, 0);
  798.  
  799.   XawDialogAddButton(dialog, "dismiss", DestroyShell, (XtPointer)dialog);
  800.  
  801.   XtPopupSpringLoaded(popup);
  802. }
  803.  
  804. /*
  805.  * pops up a message to the effect that a feature is not implemented
  806.  */
  807.  
  808. void
  809. NotImplemented(w)
  810.      Widget          w;
  811. {
  812.   SeTransMsg("notImplemented", w);
  813. }
  814.  
  815. void
  816. SeSetValue(widget, name, value)
  817.      Widget          widget;
  818.      String          name;
  819.      XtArgVal        value;
  820. {
  821.   Arg             args;
  822.  
  823.   XtSetArg(args, name, value);
  824.   XtSetValues(widget, &args, 1);
  825. }
  826.  
  827. /*
  828.  * returns a widget's height
  829.  */
  830.  
  831. Dimension
  832. SeWidgetHeight(widget)
  833.      Widget          widget;
  834. {
  835.   Dimension       height;
  836.   Arg             args;
  837.  
  838.   XtSetArg(args, XtNheight, &height);
  839.   XtGetValues(widget, &args, 1);
  840.   return height;
  841. }
  842.  
  843. /*
  844.  * sets a widget's height
  845.  */
  846.  
  847. void
  848. SeSetWidgetHeight(widget, height)
  849.      Widget          widget;
  850.      Dimension       height;
  851. {
  852.   Arg             args;
  853.  
  854.   XtSetArg(args, XtNheight, height);
  855.   XtSetValues(widget, &args, 1);
  856. }
  857.  
  858. /*
  859.  * returns a widget's width
  860.  */
  861.  
  862. Dimension
  863. SeWidgetWidth(widget)
  864.      Widget          widget;
  865. {
  866.   Dimension       width;
  867.   Arg             args;
  868.  
  869.   XtSetArg(args, XtNwidth, &width);
  870.   XtGetValues(widget, &args, 1);
  871.   return width;
  872. }
  873.  
  874. /*
  875.  * sets a widget's width
  876.  */
  877.  
  878. void
  879. SeSetWidgetWidth(widget, width)
  880.      Widget          widget;
  881.      Dimension       width;
  882. {
  883.   Arg             args;
  884.  
  885.   XtSetArg(args, XtNwidth, width);
  886.   XtSetValues(widget, &args, 1);
  887. }
  888.  
  889. /*
  890.  * sets the status message
  891.  */
  892.  
  893. void
  894. SetStatusMessage(msg)
  895.      String          msg;
  896. {
  897.   SeSetLabel(statusMessage, msg);
  898. /*  XFlush(XtDisplay(statusMessage));*/
  899. }
  900.  
  901. /*
  902.  * similar to the above, but accepts a formmat string
  903.  */
  904.  
  905. void
  906. SetStatusMessagef(fmt, a, b, c)
  907.      String          fmt,
  908.                      a,
  909.                      b,
  910.                      c;
  911. {
  912.   char            buffer[REG_BUF];
  913.  
  914.   sprintf(buffer, fmt, a, b, c);
  915.   SetStatusMessage(buffer);
  916. }
  917.  
  918. /*---------------------------------------------------------------------------+
  919. | Beep - rings the terminal bell.
  920. +---------------------------------------------------------------------------*/
  921.  
  922. void
  923. Beep()
  924. {
  925.   XKeyboardControl kb;
  926.   Display          *display = XtDisplay(topLevel);
  927.   int              pitch[3]    = {200, 400, 500},
  928.                    duration[3] = { 50, 100, 100},
  929.                    i;
  930.  
  931.   for (i = 0; i < 3; i++) {
  932.     kb.bell_pitch = pitch[i];
  933.     kb.bell_duration = duration[i];
  934.     XChangeKeyboardControl(display, KBBellPitch | KBBellDuration, &kb);
  935.   
  936.     XBell(display, 100);
  937.     XFlush(display);
  938.     usleep(100000L);
  939.   }
  940. }
  941.  
  942. /*---------------------------------------------------------------------------+
  943. | DoDisplayFile - prepares a pop up file view.
  944. +---------------------------------------------------------------------------*/
  945.  
  946. Widget
  947. DoDisplayFile(parent, fileName)
  948.      Widget          parent;
  949.      XtPointer       fileName;
  950. {
  951.   Widget          popup,
  952.                   form;
  953.  
  954.   popup = AddSimplePopup("display", parent);
  955.   form = SeAddForm("form", popup);
  956.  
  957.   XtVaCreateManagedWidget("text", asciiTextWidgetClass, form, XtNtype,
  958.                           XawAsciiFile, XtNstring, (String)fileName,
  959.                           XtNeditType, XawtextRead, XtNdisplayCaret, False,
  960.                           NULL);
  961.  
  962.   AddButton("dismiss", form, DestroyShell, NULL);
  963.  
  964.   return popup;
  965. }
  966.  
  967. /*---------------------------------------------------------------------------+
  968. | DisplayFile - pops up a file for viewing.
  969. +---------------------------------------------------------------------------*/
  970.  
  971. void
  972. DisplayFile(parent, fileName)
  973.      Widget          parent;
  974.      XtPointer       fileName;
  975. {
  976.   Widget          popup;
  977.  
  978.   popup = DoDisplayFile(parent, fileName);
  979.   CenterShell(popup, parent); 
  980.   XtPopup(popup, XtGrabNone);
  981. }
  982.  
  983.  
  984. /*---------------------------------------------------------------------------+
  985. | DialogDisplayFile - prompts for a file name then pops up the file for 
  986. |                     viewing.
  987. +---------------------------------------------------------------------------*/
  988.  
  989. void
  990. DialogDisplayFile(widget)
  991.      Widget          widget;
  992. {
  993.   GetValueByPopup(widget, "dialogDisplayFile", DisplayFile);
  994. }
  995.  
  996. /*---------------------------------------------------------------------------+
  997. | EditFile - pops up a file for editing.
  998. +---------------------------------------------------------------------------*/
  999.  
  1000. void
  1001. EditFile(parent, fileName)
  1002.      Widget          parent;
  1003.      XtPointer       fileName;
  1004. {
  1005.   Widget          popup,
  1006.                   form,
  1007.                   text;
  1008.  
  1009.   popup = AddSimplePopup("edit", parent);
  1010.   form = SeAddForm("form", popup);
  1011.  
  1012.   text = 
  1013.     XtVaCreateManagedWidget("text", asciiTextWidgetClass, form, XtNtype,
  1014.                             XawAsciiFile, XtNstring, (String)fileName, 
  1015.                             XtNeditType, XawtextEdit, XtNdisplayCaret, True,
  1016.                             NULL);
  1017.  
  1018.   AddButton("save", form, EditSaveFile, (XtPointer)text);
  1019.   AddButton("dismiss", form, DestroyShell, NULL);
  1020.  
  1021.   CenterShell(popup, parent); 
  1022.   XtPopup(popup, XtGrabNone);
  1023. }
  1024.  
  1025. /*---------------------------------------------------------------------------+
  1026. | DialogEditFile - prompts for a file name then pops up the file for editing.
  1027. +---------------------------------------------------------------------------*/
  1028.  
  1029. void
  1030. DialogEditFile(widget)
  1031.      Widget          widget;
  1032. {
  1033.   GetValueByPopup(widget, "dialogEditFile", EditFile);
  1034. }
  1035.  
  1036. /*---------------------------------------------------------------------------+
  1037. | EditSaveFile - saves the file being edited.
  1038. +---------------------------------------------------------------------------*/
  1039.  
  1040. void
  1041. EditSaveFile(widget, text)
  1042.      Widget          widget;
  1043.      XtPointer       text;
  1044. {
  1045.   Widget          textSource;
  1046.  
  1047.   XtVaGetValues((Widget)text, XtNtextSource, &textSource, NULL);
  1048.  
  1049.   if (XawAsciiSave(textSource) != True)
  1050.     SePopupMsg(widget, "File Save Failed");
  1051. }
  1052.  
  1053. void
  1054. SeAppMainLoop(appContext)
  1055.      XtAppContext    appContext;
  1056. {
  1057.   DoMainLoop = True;
  1058.   while (DoMainLoop) XtAppProcessEvent(appContext, XtIMAll);
  1059. }
  1060.  
  1061. void
  1062. StopMainLoop()
  1063. {
  1064.   DoMainLoop = False;
  1065. }
  1066.  
  1067. #ifdef notdef
  1068. int
  1069. SeAppMSleep(appContext, msec)
  1070.      XtAppContext    appContext;
  1071.      unsigned long   msec;
  1072. {
  1073.   Widget          widget = statusMessage;
  1074.   static Boolean  inSleep = False;
  1075.  
  1076.   if (inSleep) return -1;
  1077.   XtAppAddTimeOut(appContext, msec, (XtTimerCallbackProc)StopMainLoop, NULL);
  1078.  
  1079. /*  XtAddGrab(widget, True, False);*/ 
  1080.   inSleep = True;
  1081.   SeAppMainLoop(appContext);
  1082. /*  XtRemoveGrab(widget);*/
  1083.   inSleep = False;
  1084.   return 0;
  1085. }
  1086. #endif
  1087.